/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tesis.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tesis.common.utils.CollectionsUtil;
import tesis.domain.NombreCargo;
import tesis.domain.dto.CargoDTO;
import tesis.service.CargoService;
import tesis.service.CrudService;
import tesis.utils.Constantes;
import tesis.utils.TesisStringUtils;

/**
 *
 * @author hectdx
 */
@Transactional
@Service("cargoService")
public class CargoServiceImpl implements CargoService{
    private final static Logger LOG=LoggerFactory.getLogger(CargoServiceImpl.class);
    @Inject
    private CrudService crud;
    
    
    @Override
    public List<CargoDTO> find(CargoDTO filtro) {
        List<CargoDTO> lstCargos=new ArrayList<CargoDTO>();
        List<NombreCargo>results=null;
        Query query=null;
        try{
            LOG.info("buscando cargos");
            query=construirFindQuery(filtro,false);
            results=query.getResultList();
            if (!CollectionsUtil.isEmpty(results)){
                for(NombreCargo c:results){
                    lstCargos.add(new CargoDTO(c));
                }
            }
            LOG.info("lista obtenida con éxito, tam: "+lstCargos.size());
        }catch(RuntimeException ex){
            LOG.error("Error al obtener cargos",ex);
            throw ex;
        }
        return lstCargos;
    }
    
    @Override
    public Integer cantidadCargos(CargoDTO filtro) {
        try{
            LOG.info("contando cargos");
           return ((Long)construirFindQuery(filtro,true).getSingleResult()).intValue();
            
        }catch(RuntimeException ex){
            LOG.error("Error contar cargos",ex);
            throw ex;
        }
        
    }
    
    private Query construirFindQuery(CargoDTO filtro, boolean contar){
        Query query=null;
        try{
        StringBuilder sb=new StringBuilder();
        if (!contar){
            sb.append("SELECT c ");
        }else{
            sb.append("SELECT count(c) ");
        }
          sb.append(" FROM NombreCargo c where c.esActivo!='E' ");
        if (TesisStringUtils.conValor(filtro.getNombre())){
             sb.append(" AND UPPER(c.nombre) like :nombre ");
        }
        if (!contar){
            sb.append(" ORDER BY c.nombre asc ");
        }
       
        query=crud.getEm().createQuery(sb.toString());
        if (TesisStringUtils.conValor(filtro.getNombre())){
            query.setParameter("nombre", "%"+filtro.getNombre().trim().toUpperCase()+"%");
        }
        if (!contar && filtro.getStartIndex()!=null){
            query.setFirstResult(filtro.getStartIndex());
            query.setMaxResults(filtro.getResults());
        }
        }catch(RuntimeException ex){
            LOG.error("Error contar cargos",ex);
            throw ex;
        }
        return query;
    }

    @Override
    public CargoDTO findById(Integer idCargo) {
        CargoDTO cargoDTO=new CargoDTO();
        NombreCargo cargo=null;
        try{
            cargo=crud.find(idCargo, NombreCargo.class);
            if (cargo!=null){
                cargoDTO=new CargoDTO(cargo);
            }
            LOG.info("Cargo encontrado con éxito");
        }catch(RuntimeException ex){
            LOG.error("Error al buscar cargo: "+ex);
            throw ex;
        }
        return cargoDTO;
    }

    @Override
    public NombreCargo grabar(NombreCargo cargo) {
        NombreCargo original=null;
        try{
            LOG.info("grabando cargo");
            if (cargo.getCargo().getIdcargo()==null){
                cargo.setEsActivo(Constantes.ACTIVO);
                cargo.setFechaAsignacion(new Date());
                cargo.getCargo().setEsActivo(Constantes.ACTIVO);                                
                cargo.getCargo().setFechaCreacion(new Date());
                cargo=crud.create(cargo);
            }else{
                original=crud.find(cargo.getIdnombrecargo(), NombreCargo.class);
                original.setNombre(cargo.getNombre());
                original.setDescripcion(cargo.getDescripcion());
                original.setEsActivo(cargo.getEsActivo());
                cargo=crud.update(original);
            }
            LOG.info("cargo registrado con éxito: "+cargo.getCargo().getIdcargo());
        }catch(RuntimeException ex){
            LOG.error("Error al registrar cargo: "+ex);
            throw ex;
        }
        return cargo;
    }

    @Override
    public boolean eliminar(Integer idCargo) {
        NombreCargo cargo=null;
        try{
            LOG.info("Eliminar cargo "+idCargo);
            cargo=crud.find(idCargo, NombreCargo.class);
            cargo.setEsActivo(Constantes.ELIMINADO);
            crud.update(cargo);
            LOG.info("Cargo eliminado correctamente");
        }catch(RuntimeException ex){
            LOG.error("Error al eliminar cargo "+ex);
            throw ex;
        }
        return true;
    }
    
    
    
    
}
